/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package controlador;

import controlador.exceptions.NonexistentEntityException;
import controlador.exceptions.PreexistingEntityException;
import java.io.Serializable;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Query;
import javax.persistence.EntityNotFoundException;
import javax.persistence.criteria.CriteriaQuery;
import javax.persistence.criteria.Root;
import modelo.Fase;
import modelo.FasePK;


/**
 *
 * @author Mike
 */
public class FaseJpaController implements Serializable {

  public FaseJpaController() {
       
    }
    private static final EntityManagerFactory emf = conexion.getEmf();

    public EntityManager getEntityManager() {
        return emf.createEntityManager();
    }

    public void create(Fase fase) throws PreexistingEntityException, Exception {
        if (fase.getFasePK() == null) {
            fase.setFasePK(new FasePK());
        }
        EntityManager em = null;
        try {
            em = getEntityManager();
            em.getTransaction().begin();
            em.persist(fase);
            em.getTransaction().commit();
        } catch (Exception ex) {
            if (findFase(fase.getFasePK()) != null) {
                throw new PreexistingEntityException("Fase " + fase + " already exists.", ex);
            }
            throw ex;
        } finally {
            if (em != null) {
                em.close();
            }
        }
    }

    public void edit(Fase fase) throws NonexistentEntityException, Exception {
        EntityManager em = null;
        try {
            em = getEntityManager();
            em.getTransaction().begin();
            fase = em.merge(fase);
            em.getTransaction().commit();
        } catch (Exception ex) {
            String msg = ex.getLocalizedMessage();
            if (msg == null || msg.length() == 0) {
                FasePK id = fase.getFasePK();
                if (findFase(id) == null) {
                    throw new NonexistentEntityException("The fase with id " + id + " no longer exists.");
                }
            }
            throw ex;
        } finally {
            if (em != null) {
                em.close();
            }
        }
    }

    public void destroy(FasePK id) throws NonexistentEntityException {
        EntityManager em = null;
        try {
            em = getEntityManager();
            em.getTransaction().begin();
            Fase fase;
            try {
                fase = em.getReference(Fase.class, id);
                fase.getFasePK();
            } catch (EntityNotFoundException enfe) {
                throw new NonexistentEntityException("The fase with id " + id + " no longer exists.", enfe);
            }
            em.remove(fase);
            em.getTransaction().commit();
        } finally {
            if (em != null) {
                em.close();
            }
        }
    }

    public List<Fase> findFaseEntities() {
        return findFaseEntities(true, -1, -1);
    }

    public List<Fase> findFaseEntities(int maxResults, int firstResult) {
        return findFaseEntities(false, maxResults, firstResult);
    }

    private List<Fase> findFaseEntities(boolean all, int maxResults, int firstResult) {
        EntityManager em = getEntityManager();
        try {
            CriteriaQuery cq = em.getCriteriaBuilder().createQuery();
            cq.select(cq.from(Fase.class));
            Query q = em.createQuery(cq);
            if (!all) {
                q.setMaxResults(maxResults);
                q.setFirstResult(firstResult);
            }
            return q.getResultList();
        } finally {
            em.close();
        }
    }

    public Fase findFase(FasePK id) {
        EntityManager em = getEntityManager();
        try {
            return em.find(Fase.class, id);
        } finally {
            em.close();
        }
    }

    public int getFaseCount() {
        EntityManager em = getEntityManager();
        try {
            CriteriaQuery cq = em.getCriteriaBuilder().createQuery();
            Root<Fase> rt = cq.from(Fase.class);
            cq.select(em.getCriteriaBuilder().count(rt));
            Query q = em.createQuery(cq);
            return ((Long) q.getSingleResult()).intValue();
        } finally {
            em.close();
        }
    }
    
    
      public List<Fase> getFasesProyecto( int idProyecto)
    {
        StringBuilder q = new StringBuilder();
        q.append("select * from fase where idproyecto = ");
        q.append(idProyecto);
        q.append(" order by idfase asc");
        
       EntityManager em = getEntityManager();  
                  em.getTransaction().begin();
        
      
        Query query = em.createNativeQuery(q.toString(), Fase.class);
       List<Fase> results = (List<Fase>) query.getResultList();
        
        
       em.getTransaction().commit();
       em.close();
       
       return results;
        
        
        
    }
     
     public Fase consultarActividad(String idUsuario)
     {
         
         //select * from fase where estado = 'iniciado' and idresponsable = 'U00075142'
         

        StringBuilder q = new StringBuilder();
        q.append("select * from fase where estado = 'iniciado' and idresponsable like '%");
        q.append(idUsuario);
        q.append("%'");
        
       EntityManager em = getEntityManager();  
                  em.getTransaction().begin();
        
      
        Query query = em.createNativeQuery(q.toString(), Fase.class);
       List<Fase> results = (List<Fase>) query.getResultList();
        
        
       em.getTransaction().commit();
       em.close();
       
       return results.get(0);
     }
     
     public Fase getFaseActual(int idproyecto)
     {
         
        StringBuilder q = new StringBuilder();
        q.append("select * from fase where estado = 'iniciado' and idproyecto =");  
        q.append(idproyecto);
       EntityManager em = getEntityManager();  
                  em.getTransaction().begin();
        
      
        Query query = em.createNativeQuery(q.toString(), Fase.class);
       List<Fase> results = (List<Fase>) query.getResultList();
        
        
       em.getTransaction().commit();
       em.close();
       
       return results.get(0);
         
     }
     
      public String getResponsableActual(int idproyecto)
     {
         
        StringBuilder q = new StringBuilder();
        q.append("select idresponsable from fase where estado = 'iniciado' and idproyecto=");
        q.append(idproyecto);
       EntityManager em = getEntityManager();  
                  em.getTransaction().begin();
        
      
        Query query = em.createNativeQuery(q.toString());
        String results = (String) query.getSingleResult();
        
        
       em.getTransaction().commit();
       em.close();
       
       return results;
         
     }
     
     
           public String getActividadActual(int idproyecto)
     {
         
        StringBuilder q = new StringBuilder();
        q.append("select tipo_actividad from fase where estado = 'iniciado' and idproyecto=");  
        q.append(idproyecto);
       EntityManager em = getEntityManager();  
                  em.getTransaction().begin();
        
      
        Query query = em.createNativeQuery(q.toString());
        String results = (String) query.getSingleResult();
        
        
       em.getTransaction().commit();
       em.close();
       
       return results;
         
     }
     
     public void realizarActividad( int idproyecto)
     {
        Fase actual = getFaseActual(idproyecto);
        
        Fase siguiente = findFase(new FasePK(actual.getFasePK().getIdFase()+1, actual.getFasePK().getIdProyecto()));
        
        actual.setEstado("terminado");
        siguiente.setEstado("iniciado");
        try {
            edit(actual);
            edit(siguiente);
        } catch (NonexistentEntityException ex) {
            Logger.getLogger(FaseJpaController.class.getName()).log(Level.SEVERE, null, ex);
        } catch (Exception ex) {
            Logger.getLogger(FaseJpaController.class.getName()).log(Level.SEVERE, null, ex);
        }
        
     }
     
     

    
}
